# 最小RISC-V操作系统启动代码
# 参考xv6/kernel/entry.S，但大幅简化为单核版本
# QEMU -kernel 将内核加载到 0x80000000 并跳转到这里

.section .text
.global _entry
_entry:
        # 调试检查点1：输出启动标记 'S'
        li t0, 0x10000000       # UART0 基地址
        li t1, 'S'
        sb t1, 0(t0)

        # 设置栈指针
        la sp, stack_top

        # 调试检查点2：'P'
        li t1, 'P'
        sb t1, 0(t0)

        # 清零BSS段
        la t0, bss_start
        la t1, bss_end
clear_bss_loop:
        beq t0, t1, bss_cleared
        sw zero, 0(t0)
        addi t0, t0, 4           # <-- 必须步进！
        j clear_bss_loop

bss_cleared:
        # 调试检查点3：'B'
        li t0, 0x10000000
        li t1, 'B'
        sb t1, 0(t0)

        # 跳转到C端 M 模式初始化入口 start()
        call start

        # 若返回则陷入死循环，输出 'E'
spin:
        li t0, 0x10000000
        li t1, 'E'
        sb t1, 0(t0)
        j spin

 # 启动用临时栈，放到单独段，避免被清 BSS 时覆盖
.section .bootstack, "aw", @nobits
.align 12
.global stack_bottom, stack_top
stack_bottom:
        .space 4096
stack_top: